From: Ian Campbell Date: Tue, 13 Dec 2011 15:42:18 +0000 (+0000) Subject: libxl: do not leak qemu saved state on restore X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/%22bookmarks:/?a=commitdiff_plain;h=e53a33568d4127852dc272873cdcda8da8c14239;p=xen.git libxl: do not leak qemu saved state on restore In particular do not leak /var/lib/xen/qemu-resume.. Signed-off-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index c214637c7e..5397683a9a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -620,7 +620,7 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config, == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) { libxl__qmp_initializations(ctx, domid); } - ret = libxl__confirm_device_model_startup(gc, dm_starting); + ret = libxl__confirm_device_model_startup(gc, dm_info, dm_starting); if (ret < 0) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "device model did not start: %d", ret); diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 808f70eef8..8eddd6fd23 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -751,7 +751,8 @@ retry_transaction: ret = ERROR_FAIL; goto out_free; } - if (libxl__confirm_device_model_startup(gc, dm_starting) < 0) { + if (libxl__confirm_device_model_startup(gc, &xenpv_dm_info, + dm_starting) < 0) { ret = ERROR_FAIL; goto out_free; } @@ -892,14 +893,26 @@ out: int libxl__confirm_device_model_startup(libxl__gc *gc, - libxl__spawner_starting *starting) + libxl_device_model_info *dm_info, + libxl__spawner_starting *starting) { + libxl_ctx *ctx = libxl__gc_owner(gc); char *path; int domid = starting->domid; + int ret, ret2; path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid); - return libxl__spawn_confirm_offspring_startup(gc, + ret = libxl__spawn_confirm_offspring_startup(gc, LIBXL_DEVICE_MODEL_START_TIMEOUT, "Device Model", path, "running", starting); + if (dm_info->saved_state) { + ret2 = unlink(dm_info->saved_state); + if (ret2) LIBXL__LOG_ERRNO(ctx, XTL_ERROR, + "failed to remove device-model state %s\n", + dm_info->saved_state); + /* Do not clobber spawn_confirm error code with unlink error code. */ + if (!ret) ret = ret2; + } + return ret; } int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 12a668aef6..bbd7473400 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -438,6 +438,7 @@ _hidden int libxl__need_xenpv_qemu(libxl__gc *gc, * return pass *starting_r (which will be non-0) to * libxl__confirm_device_model_startup or libxl__detach_device_model. */ _hidden int libxl__confirm_device_model_startup(libxl__gc *gc, + libxl_device_model_info *dm_info, libxl__spawner_starting *starting); _hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting *starting); _hidden int libxl__wait_for_device_model(libxl__gc *gc,